home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / AmiVoGL_MDEV.lha / examples / fpatches.for < prev    next >
Text File  |  1991-06-07  |  6KB  |  304 lines

  1. c
  2. c    Draws patches of various bases
  3. c
  4.     program fpatch
  5.  
  6. $INCLUDE: 'fvogl.h'
  7. $INCLUDE: 'fvodevic.h'
  8.  
  9. c
  10. c  patch basis types
  11. c
  12.     integer *2 val, vminx, vmaxx, vminy, vmaxy
  13.     real bezier(4,4), cardinal(4, 4), bspline(4, 4)
  14.     real power(4, 4)
  15.     real x1(4, 4), y1(4, 4), z1(4, 4)
  16.     real x2(4, 4), y2(4, 4), z2(4, 4)
  17.  
  18.     character *50 labels(4)
  19.  
  20.     real    basis(64)
  21.     equivalence (basis(1), bezier(1, 1))
  22.     equivalence (basis(17), cardinal(1, 1))
  23.     equivalence (basis(33), bspline(1, 1))
  24.     equivalence (basis(49), power(1, 1))
  25.  
  26.     data bezier/
  27.      +        -1.0,    3.0,    -3.0,    1.0,
  28.      +        3.0,    -6.0,    3.0,    0.0,
  29.      +        -3.0,    3.0,    0.0,    0.0,
  30.      +        1.0,    0.0,    0.0,    0.0/ 
  31.  
  32.     data cardinal/
  33.      +        -0.5,    1.5,    -1.5,    0.5,
  34.      +        1.0,    -2.5,    2.0,    -0.5,
  35.      +        -0.5,    0.0,    0.5,    0.0,
  36.      +        0.0,    1.0,    0.0,    0.0/
  37.  
  38.     data bspline/
  39.      +         -0.166666,     0.5,     -0.5,     0.166666,
  40.      +         0.5,          -1.0,      0.5,     0.0,
  41.      +            -0.5,          0.0,      0.5,     0.0, 
  42.      +         0.166666,     0.666666, 0.166666, 0.0 /
  43.  
  44.     data power/
  45.      +        1.0, 0.0, 0.0, 0.0,
  46.      +        0.0, 1.0, 0.0, 0.0,
  47.      +        0.0, 0.0, 1.0, 0.0,
  48.      +        0.0, 0.0, 0.0, 1.0/
  49.  
  50.     data    x1 / 
  51.      +        0.0,   0.2588,   0.5,   0.7071,
  52.      +        0.0,   0.51764,  1.0,   1.4142,
  53.      +        0.0,   0.51764,  1.0,   1.4142,
  54.      +        0.0,   0.2588,   0.5,   0.7071/
  55.  
  56.     data    y1 / 
  57.      +        1.0,   0.966,   0.866,  0.7071,
  58.      +        2.0,   1.9318,  1.732,  1.4142,
  59.      +        2.0,   1.9318,  1.732,  1.4142,
  60.      +        1.0,   0.966,   0.866,  0.7071/
  61.  
  62.     data    z1 / 
  63.      +        1.0,   1.0,     1.0,    1.0,
  64.      +        1.0,   1.0,     1.0,    1.0,
  65.      +        0.0,   0.0,     0.0,    0.0,
  66.      +        0.0,   0.0,     0.0,    0.0/
  67.  
  68.     data    x2 / 
  69.      +        0.7071, 0.8660, 0.9660, 1.0,
  70.      +        1.4142, 1.7320, 1.932,  2.0,
  71.      +        1.4142, 1.7320, 1.932,  2.0,
  72.      +        0.7071, 0.8660, 0.9660, 1.0/
  73.  
  74.     data    y2 / 
  75.      +        0.7071, 0.5,    0.2588, 0.0,
  76.      +        1.4142, 1.0,    0.5176, 0.0,
  77.      +        1.4142, 1.0,    0.5176, 0.0,
  78.      +        0.7071, 0.5,    0.2588, 0.0/
  79.  
  80.     data    z2 / 
  81.      +        1.0,   1.0,     1.0,    1.0,
  82.      +        1.0,   1.0,     1.0,    1.0,
  83.      +        0.0,   0.0,     0.0,    0.0,
  84.      +        0.0,   0.0,     0.0,    0.0/
  85.  
  86.  
  87.     data labels /
  88.      +        'Bezier Patch(es)',
  89.      +        'Cardinal Patch(es)',
  90.      +        'B-Spline Patch(es)',
  91.      +        '''Power'' Patch(es)' /
  92.  
  93. c
  94. c  demonstrate patches
  95. c
  96.  
  97.     call winope('fpatches', 8)
  98.  
  99. c
  100. c We use the space bar to go to the next one...
  101. c
  102.     call unqdev(INPUTC)
  103.     call qdevic(SPACEK)
  104.  
  105. c
  106. c clear screen
  107. c
  108.     call color(BLACK)
  109.     call clear
  110. c
  111. c load a hershey font
  112. c
  113.     call hfont('times.r', 7)
  114.     call htexts(0.4, 0.4)
  115.  
  116. c
  117. c Set up two viewports (They actually overlap)
  118. c
  119.  
  120.     call getvie(vminx, vmaxx, vminy, vmaxy)
  121.  
  122.     minx = vminx
  123.     maxx = vmaxx
  124.     miny = vminy
  125.     maxy = vmaxy
  126.  
  127.     call viewpo(minx, (maxx - minx) / 10 * 6,
  128.      +              miny, (maxy - miny) / 10 * 6)
  129.  
  130.     call ortho(-2.0, 5.0, -2.0, 5.0, -2.0, 5.0)
  131.     call lookat(0.0, 0.0, 0.0, -3.0, 2.0, -4.0, 0.0)
  132. c
  133. c    Save it 
  134. c
  135.     call pushvi
  136.     call pushma
  137.  
  138.     call viewpo((maxx - minx) / 10 * 2, maxx,
  139.      +              (maxy - miny) / 10 * 2, maxy)
  140.  
  141.     call ortho(-2.0, 5.0, -2.0, 5.0, -2.0, 5.0)
  142.     call lookat(0.0, 0.0, 0.0, 3.0, 2.0, -4.0, 0.0)
  143.  
  144.  
  145. c
  146. c    patchcurves provides a number of curves in the t and u
  147. c    directions. patchprecision gives the minimum number of line
  148. c    segments making up the curves in the t and u directions. The
  149. c    actual number of linesegments in t or u is equal to the closest
  150. c    integer multiple of the number of curves, > nsegs, in t or u,
  151. c    greater than or equal to the number set by patchprecision in u or
  152. c    t. eg. curves in t will be made up of 21 line segments so that we
  153. c    can match up the 7 curves in u; curves in u will have 24 as 4 by 5
  154. c    gives 20.
  155. c
  156.     call patchc(4, 7)
  157.     call patchp(20, 20)
  158.  
  159.     do 10 i = 0, 3
  160.  
  161.         call axes
  162.  
  163.  
  164. c
  165. c         patchbasis sets the basis matrices for the t and u
  166. c         functions
  167. c
  168.         call defbas(i, basis(i*16 + 1))
  169.         call patchb(i, i)
  170.  
  171. c        Draw with viewport 2
  172. c
  173.         call move(0.0, 4.0, 0.0)
  174.         call hchars(labels(i + 1), nchars(labels(i + 1)))
  175.  
  176. c
  177. c        Now draw the patches according to the geometry matrices in
  178. c        x1, y1, and z1, x2, y2, z2.
  179. c
  180.         call drawhu(x1, y1, z1)
  181.         call patch(x1, y1, z1)
  182.  
  183.         call drawhu(x2, y2, z2)
  184.         call patch(x2, y2, z2)
  185. c
  186. c         Now with viewport 1
  187. c
  188.         call popvie
  189.         call popmat
  190.  
  191.         call axes
  192.  
  193.         call move(0.0, 4.0, 0.0)
  194.         call hchars(labels(i + 1), nchars(labels(i + 1)))
  195.  
  196. c
  197. c        now draw the patches according to the geometry matrices in
  198. c         x1, y1, and z1, x2, y2, z2.
  199. c
  200.         call drawhu(x1, y1, z1)
  201.         call patch(x1, y1, z1)
  202.  
  203.         call drawhu(x2, y2, z2)
  204.         call patch(x2, y2, z2)
  205.  
  206.         idum = qread(val)
  207. c
  208. c        Eat the up event as well...
  209. c
  210.         idum = qread(val)
  211. c
  212. c        Clear viewport 1.
  213. c
  214.         call color(BLACK)
  215.         call clear
  216. c
  217. c         Save viewport 1 again and reset to viewport 2
  218. c
  219.         call pushvi
  220.         call pushma
  221.  
  222.         call viewpo((maxx - minx) / 10 * 2, maxx,
  223.      +                      (maxy - miny) / 10 * 2, maxy)
  224.  
  225.         call ortho(-1.5, 5.0, -1.5, 5.0, -1.5, 5.0)
  226.         call lookat(0.0, 0.0, 0.0, 3.0, 2.0, -4.0, 0.0)
  227.  
  228.         call color(BLACK)
  229.         call clear
  230. 10    continue
  231.  
  232.     call gexit
  233.  
  234.     end
  235.  
  236.  
  237.     subroutine drawhu(x, y, z)
  238.     real    x(4,4), y(4,4), z(4,4)
  239.  
  240. $INCLUDE: 'fvogl.h'
  241.  
  242.     call color(MAGENT)    
  243.     do 10 i = 1,4
  244.         call move(x(i,1), y(i,1), z(i,1))
  245.         do 5 j = 1,4
  246.             call draw(x(i,j), y(i,j), z(i,j))
  247. 5        continue
  248. 10    continue
  249.     
  250.     do 20 i = 1,4
  251.         call move(x(1,i), y(1,i), z(1,i))
  252.         do 15 j = 1,4
  253.             call draw(x(j,i), y(j,i), z(j,i))
  254. 15        continue
  255. 20    continue
  256.  
  257.     call color(GREEN)
  258.     end
  259.  
  260. c
  261. c axes
  262. c
  263. c    draw the axes
  264. c
  265.  
  266.     subroutine axes
  267.  
  268.     integer YELLOW
  269.     parameter (YELLOW = 3)
  270.  
  271.     call color(YELLOW)
  272.     call move(0.0, 0.0, 0.0)
  273.     call draw(4.0, 0.0, 0.0)
  274.  
  275.     call move(0.0, 0.0, 0.0)
  276.     call draw(0.0, 4.0, 0.0)
  277.  
  278.     call move(0.0, 0.0, 0.0)
  279.     call draw(0.0, 0.0, 4.0)
  280.  
  281.     end
  282. c
  283. c nchars
  284. c
  285. c return the real length of a string padded with blanks
  286. c
  287.     integer function nchars(str)
  288.     character *(*) str
  289.  
  290.     do 10 i = len(str), 1, -1
  291.         if (str(i:i) .ne. ' ') then
  292.             nchars = i
  293.             return
  294.         end if
  295. 10      continue
  296.  
  297.     nchars = 0
  298.  
  299.     return
  300.  
  301.     end
  302.